/*
 * @Descripttion:
 * @version:
 * @Author: xiaozilai
 * @Date: 2022-11-04 19:30:18
 * @LastEditors: xiaozilai
 * @LastEditTime: 2022-11-04 19:59:29
 */
/*
 * @lc app=leetcode.cn id=397 lang=cpp
 *
 * [397] 整数替换
 *
 * https://leetcode.cn/problems/integer-replacement/description/
 *
 * algorithms
 * Medium (42.65%)
 * Likes:    256
 * Dislikes: 0
 * Total Accepted:    61.2K
 * Total Submissions: 143.6K
 * Testcase Example:  '8'
 *
 * 给定一个正整数 n ，你可以做如下操作：
 *
 *
 * 如果 n 是偶数，则用 n / 2替换 n 。
 * 如果 n 是奇数，则可以用 n + 1或n - 1替换 n 。
 *
 *
 * 返回 n 变为 1 所需的 最小替换次数 。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：n = 8
 * 输出：3
 * 解释：8 -> 4 -> 2 -> 1
 *
 *
 * 示例 2：
 *
 *
 * 输入：n = 7
 * 输出：4
 * 解释：7 -> 8 -> 4 -> 2 -> 1
 * 或 7 -> 6 -> 3 -> 2 -> 1
 *
 *
 * 示例 3：
 *
 *
 * 输入：n = 4
 * 输出：2
 *
 *
 *
 *
 * 提示：
 *
 *
 * 1 <= n <= 2^31 - 1
 *
 *
 */

// @lc code=start
#include <iostream>
using namespace std;
class Solution {
public:
    int integerReplacement(int n) {
        int ans = 0;
        long long temp = n;
        while (temp != 1) {
            if (temp == 3) {
                ans += 2;
                temp = 1;
            } else if (temp % 2 == 0) {
                ++ans;
                temp /= 2;
            } else {
                ++ans;
                if (temp & 0x02) {
                    temp += 1;
                } else {
                    temp -= 1;
                }
            }
        }
        return ans;
    }
};
// @lc code=end
